#include "Pagina.h"

/*
	Classe Pagina, classe responsavel pela criacao de objetos pagina que serao usadas na criacao do documento. cada pagina sera composta por um conjunto de midias, onde uma midia pode ser um texto ou uma imagem.
*/

/*
	Construtor default da classe Pagina, realiza a inicializacao dos atributos da classe com dados default.
*/
Pagina::Pagina()
{
	direcao = HPDF_PAGE_PORTRAIT;
	alinhamento = 3;
	dimensao = HPDF_PAGE_SIZE_A4;
	margemDireita = 0;
	margemEsquerda = 0;
	margemSuperior = 0;
	margemInferior = 0;
}

/*
	Construtor que recebe o valor que serao atribuidos aos atributos como parametro.
*/
Pagina::Pagina(double margemDir, double margemEsq, double margemSup, double margemInf, int align, int dim, int dir)
{
	margemDireita = margemDir;
	margemEsquerda = margemEsq;
	margemSuperior = margemSup;
	margemInferior = margemInf;
	alinhamento = align;
	direcao = dir;
	dimensao = dim;
}

/*
	Destrutor default da classe.
*/
Pagina::~Pagina()
{
}

/*
	Procedimento usado para atualizar o valor da margem direita da pagina corrente.
*/
void Pagina::setMargemDireita(double margemDir)
{
	margemDireita = margemDir;
}

/*
	Procedimento usado para atualizar o valor da margem esquerda da pagina corrente.
*/
void Pagina::setMargemEsquerda(double margemEsq)
{
	margemEsquerda = margemEsq;
}

/*
	Procedimento usado para atualizar o valor da margem superior da pagina corrente.
*/
void Pagina::setMargemSuperior(double margemSup)
{
	margemSuperior = margemSup;
}

/*
	Procedimento usado para atualizar o valor da margem inferior da pagina corrente.
*/
void Pagina::setMargemInferior(double margemInf)
{
	margemInferior = margemInf;
}

/*
	Procedimento que atualiza o vetor de midias que compoem a pagina corrente.
*/
void Pagina::setMidias(vector<Midia> mds)
{
	for(int i=0; i<mds.size(); i++)
	{
		midias.push_back(mds.at(i));
	}
}

/*
	Procedimento usado para adicionar uma nova midia a pagina corrente.
*/
void Pagina::addMidia(Midia m)
{
	midias.push_back(m);
}

/*
	Procedimento usado para atualizar o alinhamento da pagina corrente.
*/
void Pagina::setAlinhamento(int align)
{
	alinhamento = align;
}

/*
	Procedimento usado para atualizar a dimensao da pagina corrente.
*/
void Pagina::setDimensao(int dim)
{
	dimensao = dim;
}

/*
	Procedimento usado para adicionar uma pagina da biblioteca libHaru a pagina corrente.
*/
void Pagina::setHpdfPage(HPDF_Page pg)
{
	page = pg;
}

/*
	Procedimento usado para atualizar a direcao da pagina corrente.
*/
void Pagina::setDirecao(int dir)
{
	direcao = dir;
}

/*
	Funcao usada para retornar o valor correspondente a margem direita da pagina corrente.
*/
double Pagina::getMargemDireita()
{
	return margemDireita;
}

/*
	Funcao usada para retornar o valor correspondente a margem esquerda da pagina corrente.
*/
double Pagina::getMargemEsquerda()
{
	return margemEsquerda;
}

/*
	Funcao usada para retornar o valor correspondente a margem superior da pagina corrente.
*/
double Pagina::getMargemSuperior()
{
	return margemSuperior;
}

/*
	Funcao usada para retornar o valor correspondente a margem inferior da pagina corrente.
*/
double Pagina::getMargemInferior()
{
	return margemInferior;
}

/*
	Funcao usada para retornar o conjunto de midias que compoem a pagina corrente.
*/
vector<Midia> Pagina::getMidias()
{
	return midias;
}

/*
	Funcao usada para retornar o valor correspondente a uma determinada midia da pagina corrente passada como parametro para a funcao.
*/
Midia Pagina::getMidia(int index)
{
	return midias.at(index);
}

/*
	Funcao usada para retornar o valor correspondente ao alinhamento da pagina corrente.
*/
int Pagina::getAlinhamento()
{
	return alinhamento;
}

/*
	Funcao usada para retornar o valor correspondente a dimensao da pagina corrente.
*/
int Pagina::getDimensao()
{
	switch (dimensao)
	{
		case 1:
			return HPDF_PAGE_SIZE_A4;
		case 2:
			return HPDF_PAGE_SIZE_A3;
		case 3:
			return HPDF_PAGE_SIZE_A5;
		case 4:
			return HPDF_PAGE_SIZE_B4;
		case 5:
			return HPDF_PAGE_SIZE_B5;
		case 6:
			return HPDF_PAGE_SIZE_EXECUTIVE;
		case 7:
			return HPDF_PAGE_SIZE_LETTER;
		case 8:
			return HPDF_PAGE_SIZE_LEGAL;
		case 9:
			return HPDF_PAGE_SIZE_US4x6;
		case 10:
			return HPDF_PAGE_SIZE_US4x8;
		case 11:
			return HPDF_PAGE_SIZE_US5x7;
		case 12:
			return HPDF_PAGE_SIZE_COMM10;
		default:
			return HPDF_PAGE_SIZE_A4;
	}
}

/*
	Funcao usada para retornar o valor correspondente a direcao da pagina corrente.
*/
int Pagina::getDirecao(){
	switch(direcao) {
		case 0: return HPDF_PAGE_PORTRAIT;
		case 1: return  HPDF_PAGE_LANDSCAPE;
		default: return HPDF_PAGE_PORTRAIT;
	}
}

/*
	Funcao usada para retornar o valor correspondente a largura da pagina corrente.
*/
double Pagina::getWidth()
{
	return HPDF_Page_GetWidth(page);
}

/*
	Funcao usada para retornar o valor correspondente a altura da pagina corrente.
*/
double Pagina::getHeight()
{
	return HPDF_Page_GetHeight(page);
}

/*
	Funcao usada para retornar a pagina da biblioteca libHaru da pagina corrente.
*/
HPDF_Page Pagina::getHpdfPage()
{
	return page;
}

/*
	Funcao usada para calcular e retornar a area da pagina corrente.
*/
double Pagina::getAreaPagina()
{
	return getHeight()*getWidth();
}
